package main

import (
	"fmt"
	"math"
)

// 牛顿法实现平方根函数
// 计算机通常使用循环来计算 x 的平方根。从某个猜测的值 z 开始，我们可以根据 z² 与 x 的近似度来调整 z，产生一个更好的猜测
// z -= (z*z - x) / (2*z)
// 重复调整的过程，猜测的结果会越来越精确，得到的答案也会尽可能接近实际的平方根。
//
//在提供的 func Sqrt 中实现它。无论输入是什么，对 z 的一个恰当的猜测为 1。 要开始，请重复计算 10 次并随之打印每次的 z 值。
// 观察对于不同的值 x（1、2、3 ...）， 你得到的答案是如何逼近结果的，猜测提升的速度有多快。
// 然后，修改循环条件，使得当值停止改变（或改变非常小）的时候退出循环
func Sqrt(x float64) float64 {
	z := 1.0
	for math.Abs(z * z - x) > 0.001 {
		z -= (z * z - x) / (2 * z)
	}
	return z
}

// 练习：循环与函数
func main() {
	fmt.Println(Sqrt(2))
}
